JAVA -GUI 01.基本概念

AWT 與 Swing

Java API 中有兩個套件,分別是 AWT 與 Swing ,兩者都可以製作圖形介面的程式。

AWT 為 Abstract Window Toolkit 的縮寫詞,這是 Java 1.1 版之前官方程式庫 (libiary) 提供的套件 (package) ,後來 1.2 版以後又採納 Swing 當第二個官方 GUI 的程式庫。

兩者的差別在於, AWT 採用作業系統 (operating system) 提供的視窗元件,所以利用 AWT 所設計的視窗圖形程式會跟作業系統原本的視窗風格一致, Swing 則是利用 Java 原生程式碼重新繪出視窗元件,因此利用 Swing 設計的程式在各平台間並無外觀上的差異。兩者的差異還涉及佔用系統資源的多寡。

AWT 在 java.awt 套件中, Swing 在 javax.swing 套件裡,我們以介紹 Swing 為主,以下列出常用的視窗元件

元件名稱 類別名稱
視窗 JFrame
面板 JPanel
標籤 JLabel
按鈕 JButton
核取方塊 JCheckBox
選取方塊 JRadioButton
下拉式列表 JComboBox
列表 JList
捲動軸 JScrollBar
滑動軸 JSlider
文字方塊 JTextField
密碼文字方塊 JPasswordField
文字區域 JTextArea
彈出式選單 JPopupMenu
下拉式選單列 JMenuBar
下拉式選單 JMenu
下拉式選單項目 JMenuItem
下拉式選單核取方塊 JCheckBoxMenuItem
下拉式選單選取按鈕 JRadioButtonMenuItem
工具列 JToolBar
檔案選擇 JFileChooser
色彩選擇 JColorChooser
多重視窗 JDesktopPane JInternalFrame
對話視窗 JDialog

Swing 基本概念

Swing 是一個為Java設計的GUI工具包。
Swing是JAVA基礎類的一部份,包括了圖形用戶界面(GUI)器件如:文本框,按鈕,分隔窗格和表。

Swing提供許多比AWT更好的屏幕顯示元素。它們用純Java寫成,所以同Java本身一樣可以跨平台運行,這一點不像AWT。它們是JFC的一部分。它們支持可更換的面板和主題(各種操作系統默認的特有主題),然而不是真的使用原生平台提供的設備,而是僅僅在表面上模仿它們。這意味著你可以在任意平台上使用JAVA支持的任意麵板。輕量級組件的缺點則是執行速度較慢,優點就是可以在所有平台上採用統一的行為。

示範 Swing 程式的基本概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.awt.*;
import javax.swing.*;

public class GUIDemo1 {
public static void main(String[] args) {
JFrame demo = new JFrame();
demo.setSize(400, 300);
demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JCheckBox checkbox = new JCheckBox("JCheckBox");
JRadioButton radiobutton = new JRadioButton("JRadiobutton");
JButton button = new JButton("JButton");
JLabel label = new JLabel("JLabel");
JTextArea textarea = new JTextArea("JTextArea");

demo.getContentPane().add(BorderLayout.EAST, checkbox);
demo.getContentPane().add(BorderLayout.WEST, radiobutton);
demo.getContentPane().add(BorderLayout.SOUTH, button);
demo.getContentPane().add(BorderLayout.NORTH , label);
demo.getContentPane().add(BorderLayout.CENTER, textarea);

demo.setVisible(true);
}
}

結果如下
GUI1

GUIDemo 類別只有一個 main() 函數,我們直接在 main() 裡完成全部的 GUI 建置工作。
第一件事是宣告 JFrame 類別的物件

JFrame demo = new JFrame();

demo 是 JFrame 類別的物件,我們總共在 demo 上頭做了四件不同的工作,首先,設定視窗的大小,這是呼叫 setSize() 方法
demo.setSize(400, 300);

接著呼叫了 setDefaultCloseOperation 方法,這個方法是設定視窗標題列的關閉按鈕結束程式執行,提供 JFrame 類別的 staic 屬性 (field) EXIT_ON_CLOSE 當參數 (parameter)

demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

然後,我們另外宣告建立 5 個不同的視窗元件,從上而下分別是核取方塊、選取方塊、按鈕、標籤與文字區域

1
2
3
4
5
JCheckBox checkbox = new JCheckBox("JCheckBox");
JRadioButton radiobutton = new JRadioButton("JRadiobutton");
JButton button = new JButton("JButton");
JLabel label = new JLabel("JLabel");
JTextArea textarea = new JTextArea("JTextArea");

我們在建構子 (constructor) 中提供的字串 (string) 會是該視窗元件預設顯示的訊息。

第三件工作便是將視窗元件放到 demo 中了,這裡, demo 呼叫 getContentPane() 方法取得 JFrame 的 contentPane 物件,然後由 contentPane 物件呼叫 add() 方法將視窗元件放進去

1
2
3
4
5
demo.getContentPane().add(BorderLayout.EAST, checkbox);
demo.getContentPane().add(BorderLayout.WEST, radiobutton);
demo.getContentPane().add(BorderLayout.SOUTH, button);
demo.getContentPane().add(BorderLayout.NORTH , label);
demo.getContentPane().add(BorderLayout.CENTER, textarea);

視窗元件要放到面板 (panel) 中才可以顯示在視窗上,實際上, contentPane 屬於 Container 型態的面板物件, Container 是在 java.awt 中所定義的類別,因此, add() 方法用的參數 BorderLayout.EAST 等,這些都在 java.awt 中。

所以在程式檔案的一開始,除了 import java.swing 之外,也 import java.awt 。

1
2
import java.awt.*;
import javax.swing.*;

其實 java.swing 的類別多半繼承 (inherit) 自 java.awt ,這是說 Swing 是由 AWT 延伸出的套件,因此兩者之間有很多地方可以互通, Swing 有些地方也需要用到 AWT 的東西,例如此例中的 BorderLayout.EAST等。

JFrame 的 contentPane 預設的編排方式為東、西、南、北、中等五個區域,我們各自在一個區域中放入一個視窗元件。

最後就是呼叫 demo 的 setVisible() 方法,並設置成 true ,這樣才會顯示在螢幕上頭
demo.setVisible(true);

所以利用 Swing 設置 GUI 的步驟是先建立 JFrame 型態的物件,然後視窗元件再逐一放到 JFrame 物件裡

中英文術語對照

標籤 label
按鈕 button
選單 menu
文字方塊 textfield
程式庫 libiary
套件 package
作業系統 operating system
物件 object
類別 class
方法 method
屬性 field
參數 parameter
建構子 constructor
字串 string
面板 panel
繼承 inherit

概念解析

JFrame – java的GUI程序的基本思路是以JFrame為基礎,它是屏幕上window的對象,能夠最大化、最小化、關閉。

JPanel – Java圖形用戶界面(GUI)工具包swing中的面板容器類,包含在javax.swing包中,可以進行嵌套,功能是對窗體中具有相同邏輯功能的組件進行組合,是一種輕量級容器,可以加入到JFrame窗體中。。

JLabel – JLabel對象可以顯示文本、圖像或同時顯示二者。可以通過設置垂直和水平對齊方式,指定標籤顯示區中標籤內容在何處對齊。默認情況下,標籤在其顯示區內垂直居中對齊。默認情況下,只顯示文本的標籤是開始邊對齊;而只顯示圖像的標籤則水平居中對齊。

JTextField –一個輕量級組件,它允許編輯單行文本。

JPasswordField –允許我們輸入了一行字像輸入框,但隱藏星號(*)或點創建密碼(密碼)

JButton – JButton類的實例。用於創建按鈕類似實例中的”Login”

Reference:
http://www.runoob.com/w3cnote/java-swing-demo-intro.html
https://pydoing.blogspot.com/2011/05/java-basic-concept-of-gui.html